Deklarera med const i JavaScript och "immutable" objekt ... Du behöver inte oroa dig ...

const

Sedan ES6 (EcmaScript 2015) som gav oss "block-scope" (måsvinge-definitionsområde), let och const, har det blivit populärt att använda const till alla variabler!
Detta för att man oroar sig över att variabeln kommer att skrivas över, eller pekas någon annanstans.

När det gäller variabler i JavaScript bör man tänka "variabeln pekar mot" (likamed-tecken) ett object.
För att när man pekar samma variabel mot ett annat objekt, så kommer det gamla objektet att fortfarande finnas kvar!

I koden ovan kommer du fortfarande få se en alert-ruta med meddelandet hej, även fast timeout har pekats om till null.

Immutable

Engelska "immutable" (oföränderlig) betyder att objektet eller värdet inte kan ändras.
Och i JavaScript är alla objekt och värden oföränderliga! Du behöver alltså inte oro dig för att värdet eller objektet ändras. Så är det inte i andra programmerings-språk, till exempel C, vilket kan skapa buggar som är svåra att hitta.

Variabeln originalLista pekar fortfarande mot den gamla Array:en som inköpslista pekade mot. Även fast inköpslista nu pekar mot en ny Array!

Även fast magisktTal pekas om till Nummer 6 så pekar svaretPåAllt fortfarande till Nummer 42.
Ska man vara riktigt petig så beror det dock på att värden (nummer och strängar) i JavaScript kopieras "byVal" (Engelska: By value) d.v.s. värdet av 42 kopieras över till ett nytt object som också får värdet 42.
Du behöver dock inte oroa dig för att värdet ska ändras!

Objekt i JavaScript

Alla objekt i JavaScript förutom String och Number, undefined, null, true, false kan tilldelas metoder och attribut.

Att tilldela attribut (inköpslista.klar) och metod (inköpslista.hämta) på en Array är mycket ovanligt, jag ville bara visa att det går.

Även fast objekt är oföränderliga kan man fortfarande lägga till variabler (pekare). Till exempel inköpslista.klar pekas mot en Boolean (false).
Att man fel-stavar attribut/metoder är en mycket vanlig orsak till buggar. Att man råkar peka om en variabel är dock inte lika vanligt. Du behöver därför inte oroa dig så mycket för att variabeln pekas om. Och du behöver inte oroa dig för att objektet ändras.

const och objekt

Åter till const. Vilket är en förkortning till engelskans "constant" vilket betyder att variabeln pekar mot ett objekt som inte kan ändras:
Objektet är konstant. Objekt i JavaScript kan dock inte ändras! Så det enda const gör att att förhindra att variabeln pekas om.

Om du försöker ändra magisktTal till 6 så säger JavaScript motorn "fy, fy, du kan inte peka om mig". Engelska: "TypeError: Assignment to constant variable."

Kom ihåg är att const endast förhindrar variabeln att pekas om till ett annat objekt.
const förhindrar inte att en variabel i objektet pekas om.

Det går dock att förhindra med hjälp av defineProperty (ES5)!

Ska jag använda const ?

Nja ... Att använda const anses som god praxis. Du kommer dock inte att få en klapp på axeln, då du inte förhindrat några buggar. Du kan däremot ha skapat problem ...

Om du använder const som den nya var så kan koden bli onödigt komplicerad.
Något som blir allt vanligare på grund av const är trefaldiga operations-symboler (Engelska: "ternary operators")

Det kan bli riktigt trassligt om det är flera efter och i varandra.

Koden blir dock enklare om du använder en variabel i stället:

Eller

Om potatis är grön blir ätbar = undefined då alla variabler som deklareras med var i JavaScript automatiskt blir upplyfta till toppen av funktionen (Engelska "hoisted")
och får värdet undefined, vilket är falskt (Engelska: "falsy"), medan variabler deklarerade med let inte "hoistas" och måste deklareras i förväg.

Jag är lite kluven i frågan om man ska använda let och const i stället för var. let anses som den nya var, men personligen tycker jag att "hoisting" och funktions-definitions-område (Engelska function scope) är en av JavaScript's fina egenskaper.



Blogginlägg skrivet av Johan Zetterberg 20 Juni 2018


Följ mig via RSS:   RSS https://zäta.com/rss.xml (ange adressen i din feed-läsare)